/**
 * 
 */
package model;

import model.container.Cursussen;
import model.container.Lectoren;
import utils.TijdsMoment1Dag;

public class AangebodenCursus implements Comparable<AangebodenCursus>, Cloneable {

	/**
	 * The Class AangebodenCursus has a local variable aantalPlaatsen and other variables which are<br>
	 * coming from other classes.
	 * 
	 * @author Nicolas Vanderhulst
	 * @author Yves Vandeput
	 * @version 20111009
	 */

	private int aangebodenCursusId;
	private int aantalPlaatsen;
	private TijdsMoment1Dag tijdsMoment;
	private Lector lector;
	private Cursus aangebodenCursus;
	private Lokaal lokaal;

	/**
	 * @return the aangeboden cursus ID
	 */
	public int getAangebodenCursusId() {
		return aangebodenCursusId;
	}

	/**
	 * @param aangebodenCursusId
	 */
	public void setAangebodenCursusId(int aangebodenCursusId) {
		this.aangebodenCursusId = aangebodenCursusId;
	}

	/**
	 * @return the aantalPlaatsen
	 */
	public int getAantalPlaatsen() {
		return aantalPlaatsen;
	}

	/**
	 * @param aantalPlaatsen
	 *            the aantalPlaatsen to set
	 */
	public void setAantalPlaatsen(int aantalPlaatsen) {
		this.aantalPlaatsen = aantalPlaatsen;
	}

	/**
	 * @return the tijdsMoment
	 */
	public TijdsMoment1Dag getTijdsMoment() {
		return tijdsMoment;
	}

	/**
	 * @param tijdsMoment
	 *            the tijdsMoment to set
	 */
	public void setTijdsMoment(TijdsMoment1Dag tijdsMoment) {
		this.tijdsMoment = tijdsMoment;
	}

	/**
	 * @return the aangebodenCursuss
	 */
	public Cursus getAangebodenCursus() {
		return aangebodenCursus;
	}

	/**
	 * @param aangebodenCursus
	 *            the aangebodenCursussen to set
	 */
	public void setAangebodenCursus(Cursus aangebodenCursus) {
		this.aangebodenCursus = aangebodenCursus;
	}

	/**
	 * @return the lector
	 */
	public Lector getLector() {
		return lector;
	}

	/**
	 * @param lector
	 *            the lector to set
	 */
	public void setLector(Lector lector) {
		this.lector = lector;
	}

	/**
	 * @return the lokaal
	 */
	public Lokaal getLokaal() {
		return lokaal;
	}

	/**
	 * @param lokaal
	 *            the lokaal to set
	 */
	public void setLokaal(Lokaal lokaal) {
		this.lokaal = lokaal;
	}

	// Default Constructor
	public AangebodenCursus() {

	}

	// Basic Constructor
	public AangebodenCursus(Cursus ac, int ap, Lector l, Lokaal oc, TijdsMoment1Dag t) throws IllegalArgumentException {
		this.setAangebodenCursus(ac);
		this.setAantalPlaatsen(ap);
		this.setLokaal(oc);
		this.setLector(l);
		this.setTijdsMoment(t);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see java.lang.Object#hashCode()
	 */
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((aangebodenCursus == null) ? 0 : aangebodenCursus.hashCode());
		result = prime * result + aantalPlaatsen;
		result = prime * result + ((lector == null) ? 0 : lector.hashCode());
		result = prime * result + ((tijdsMoment == null) ? 0 : tijdsMoment.hashCode());
		return result;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see java.lang.Object#equals(java.lang.Object)
	 */
	@Override
	public boolean equals(Object obj) {
		if (this == obj) {
			return true;
		}
		if (obj == null) {
			return false;
		}
		if (!(obj instanceof AangebodenCursus)) {
			return false;
		}
		AangebodenCursus other = (AangebodenCursus) obj;
		if (aangebodenCursus == null) {
			if (other.aangebodenCursus != null) {
				return false;
			}
		} else if (!aangebodenCursus.equals(other.aangebodenCursus)) {
			return false;
		}
		if (aantalPlaatsen != other.aantalPlaatsen) {
			return false;
		}
		if (lector == null) {
			if (other.lector != null) {
				return false;
			}
		} else if (!lector.equals(other.lector)) {
			return false;
		}
		if (tijdsMoment == null) {
			if (other.tijdsMoment != null) {
				return false;
			}
		} else if (!tijdsMoment.equals(other.tijdsMoment)) {
			return false;
		}
		return true;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see java.lang.Object#toString()
	 */
	@Override
	public String toString() {
		return "AangebodenCursus [aantalPlaatsen= " + aantalPlaatsen + ", tijdsMoment= " + tijdsMoment
				+ ", aangebodenCursussen= " + aangebodenCursus + ", lector=" + lector + "]";
	}

	@Override
	public int compareTo(AangebodenCursus a) {
		if (a.getAangebodenCursusId() > this.aangebodenCursusId) {
			return -1;
		} else if (a.getAangebodenCursusId() < this.aangebodenCursusId) {
			return 1;
		} else {
			return 0;
		}
	}

	@SuppressWarnings("boxing")
	public String maakTekstVanObject() {
		return String.format("%s\t%s\t%s\t%s\t%s\t%s\n", this.getAangebodenCursusId(), this.getAangebodenCursus()
				.getID(), this.getLector().getLectorCode(), this.getLokaal().toString(), this.getAantalPlaatsen(), this
				.getTijdsMoment().toString());
	}

	public AangebodenCursus maakObjectVanTekst(String input) {
		AangebodenCursus tempCursus = new AangebodenCursus();
		String[] tokens = input.split("\t");
		// Opvullen variabelen
		tempCursus.setAangebodenCursusId(Integer.parseInt(tokens[0]));
		tempCursus.setAantalPlaatsen(Integer.parseInt(tokens[4]));
		tempCursus.setLokaal(Lokaal.valueOf(tokens[3]));
		// Invullen van tijdsmoment
		String[] tijdstip = tokens[6].split(":");
		String[] duurtijd = tokens[7].split(" ");
		String lesdag = tokens[5];
		int startUur = Integer.parseInt(tijdstip[0]);
		int startMin = Integer.parseInt(tijdstip[1]);
		int duur = Integer.parseInt(duurtijd[1]);
		TijdsMoment1Dag tempTijd = new TijdsMoment1Dag(lesdag, startUur, startMin, duur);
		tempCursus.setTijdsMoment(tempTijd);
		return tempCursus;
	}

	public void addCursusVanTekst(String input, Cursussen cursusContainer) {
		String[] tokens = input.split("\t");
		int cursusId = Integer.parseInt(tokens[1]);
		Cursus tempCursus = cursusContainer.getCursusByCode(cursusId);
		this.setAangebodenCursus(tempCursus);
	}

	public void addLectorVanTekst(String input, Lectoren lectorenContainer) {
		String[] tokens = input.split("\t");
		int lectorId = Integer.parseInt(tokens[2]);
		Lector templector = lectorenContainer.getLectorByCode(lectorId);
		this.setLector(templector);
	}
}
